package ai

import (
	"context"
	"encoding/json"
	"fmt"
	"time"

	"anders-cli/internal/config"

	"github.com/go-resty/resty/v2"
)

// OllamaBackend Ollama AI后端实现
type OllamaBackend struct {
	client  *resty.Client
	baseURL string
	model   string
}

// NewOllamaBackend 创建新的Ollama后端实例
func NewOllamaBackend() *OllamaBackend {
	cfg := config.Get()

	return &OllamaBackend{
		client:  resty.New(),
		baseURL: cfg.Ollama.Host,
		model:   cfg.Ollama.Model,
	}
}

// Name 返回后端名称
func (b *OllamaBackend) Name() string {
	return "Ollama"
}

// GetModel 返回当前使用的模型名称
func (b *OllamaBackend) GetModel() string {
	return b.model
}

// Query 执行AI查询
func (b *OllamaBackend) Query(prompt string, tools []Tool) (string, error) {
	// 从配置获取超时时间
	cfg := config.Get()
	queryTimeout := time.Duration(cfg.MultiAgent.QueryTimeout) * time.Second
	if queryTimeout <= 0 {
		queryTimeout = 120 * time.Second // 默认120秒
	}

	// 创建超时上下文
	ctx, cancel := context.WithTimeout(context.Background(), queryTimeout)
	defer cancel()

	// 查询开始

	// 构建请求消息
	messages := []Message{
		{
			Role:    "user",
			Content: prompt,
		},
	}

	// 构建请求体
	requestBody := map[string]interface{}{
		"model":    b.model,
		"messages": messages,
		"stream":   false,
	}

	// 如果有工具，添加到请求中
	if len(tools) > 0 {
		requestBody["tools"] = tools
	}

	// 发送请求（带超时上下文）
	resp, err := b.client.R().
		SetHeader("Content-Type", "application/json").
		SetBody(requestBody).
		SetContext(ctx).
		Post(b.baseURL + "/api/chat")

	if err != nil {
		return "", fmt.Errorf("Ollama 请求失败: %v", err)
	}

	if resp.StatusCode() != 200 {
		return "", fmt.Errorf("Ollama API 返回错误状态码: %d", resp.StatusCode())
	}

	// 解析Ollama响应格式
	var response struct {
		Message struct {
			Content string `json:"content"`
		} `json:"message"`
		Done bool `json:"done"`
	}

	if err := json.Unmarshal(resp.Body(), &response); err != nil {
		return "", fmt.Errorf("解析响应失败: %v", err)
	}

	if !response.Done {
		return "", fmt.Errorf("响应未完成")
	}

	content := response.Message.Content

	return content, nil
}
